import smtplib  # Python 中自带的提供 SMTP 邮件传输服务的模块
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText  # Python 中自带的用于发送纯文本对象的类库


class SendEmail:

    # 构造方法中实现设置服务器信息
    def __init__(self, mail_host, mail_user, mail_key, sender, receives):
        self.mail_host = mail_host  # 定义主机域名
        self.mail_user = mail_user  # 定义登陆账号
        self.mail_key = mail_key  # 授权码-登陆QQ邮箱网页版，账号里面获取；
        self.sender = sender
        self.receives = receives

    # 纯文本邮件的发送
    def send_mail_by_text(self, context):
        message = MIMEText(context, 'plain', 'utf-8')  # 通过实例化 MIMEText 创建一个 message 对象
        message["Subject"] = '自动化测试报告邮件'  # 邮件标题
        message["From"] = "Ren <438435413@qq.com>"  # 邮件中显示发送者是谁
        message["To"] = "Jie <2435699735@qq.com,1721587756@qq.com>"  # 邮件中显示接受者是谁
        self.login_send(m=message)  # 实例方法调用实例方法 self.方法名()

    # 文本+附件的邮件发送
    def send_mail_by_att(self, file_path):
        message = MIMEMultipart()  # 通过实例化 MIMEMultipart 创建一个能够包含多个主体部分的对象（集装箱）
        message["Subject"] = '测试邮件'  # 邮件标题
        message["From"] = "Ren <438435413@qq.com>"  # 邮件中显示发送者是谁
        message["To"] = "Jie <2435699735@qq.com,1721587756@qq.com>"  # 邮件中显示接受者是谁
        context = "自动测试报告，详情见附件"
        body_text = MIMEText(context, 'plain', 'utf-8')
        message.attach(body_text)  # 把文本主体对象添加到集装箱
        att_body = open(file_path, 'rb')  # 以二进制形式打开附件文件，注意：rb 模式打开不需要指定编码格式
        att = MIMEApplication(att_body.read())  # 通过实例化 MIMEApplication 类创建一个附件主体对象
        att_body.close()
        att.add_header('Content-Disposition', 'attachment', filename="allureReport.zip")
        message.attach(att)
        # 实例方法调用实例方法，实例方法调用类方法，实例方法调用静态方法
        self.login_send(m=message)  # 实例方法调用实例方法 self.方法名()

    # 进行登陆发送
    def login_send(self, m):
        smtpobj = smtplib.SMTP()  # 实例化 smtplib 模块下面的 SMTP 类
        smtpobj.connect(self.mail_host, 25)  # 调用 SMTP 这个类下面的 connect 方法来实现对服务器建立链接
        smtpobj.login(self.mail_user, self.mail_key)  # 调用 SMTP 这个类下面的 login 方法实现登陆
        smtpobj.sendmail(self.sender, self.receives, m.as_string())  # 调用 SMTP 这个类下面的 sendmail 方法实现邮件发送
